#include <iostream>
#include <cstdlib>

class Test
{
public:
    Test()
    {
        std::cout<<"无参构造函数!"<<std::endl;
    }

    ~Test()
    {
        std::cout<<"析构函数!"<<std::endl;
    }
};

int main()
{
#if 0
    // 所谓的malloc free其实就是给你一个空间用，用完手动释放，这个空间用来干什么，要不要初始化，它根本就不关心
    Test *t = (Test*)malloc(sizeof(Test));
    free(t);    // 没有构造和析构的过程 
#endif

#if 0
    // 而new delete会调用构造析构函数，释放对象空间
    Test *t = new Test; // 把类的对象创建到堆上
    delete t;   // 有构造和析构的过程 
#endif

#if 0
    // 普通类型直接释放指针没有问题（因为普通类型不需要构造和析构，而自定义类型需要构造和析构）
    int *a = new int[3];
    delete a;
#endif

#if 1
    // 自定义类的对象，就一定要进行[]释放
    Test *t = new Test[10]; // 数组对每一个对象都会进行构造和析构
    // delete t;   // 不能直接delete t不写中括号，要对每一个对象进行释放析构，而如果不是以数组的形式释放，就像这样只传一个首指针，那它释放了第一个，后面的就不知道怎么释放了
    delete []t; // 所以必须要以数组的形式释放，严格匹配
    // 所以养成习惯，不管是普通类型还是自定义类的对象，只要是数组定义，都进行[]释放
#endif

    return 0;
}